home *** CD-ROM | disk | FTP | other *** search
- /* @(#) $Header: remote_kbd.c,v 1.11 91/09/17 22:22:03 deyke Exp $ */
-
- #include <sys/types.h>
-
- #include <stdio.h>
- #include <sys/socket.h>
- #include <unistd.h>
-
- #include "global.h"
- #include "hpux.h"
- #include "buildsaddr.h"
- #include "main.h"
-
- extern char Prompt[];
-
- static int fkbd = -1;
- static int flisten = -1;
-
- static void accept_connection __ARGS((void *p));
-
- /*---------------------------------------------------------------------------*/
-
- int dobye(argc, argv, p)
- int argc;
- char *argv[];
- void *p;
- {
- if (fkbd >= 0) {
- freopen("/dev/null", "r+", stdin);
- freopen("/dev/null", "r+", stdout);
- freopen("/dev/null", "r+", stderr);
- off_read(fkbd);
- fkbd = -1;
- }
- return 0;
- }
-
- /*---------------------------------------------------------------------------*/
-
- static void accept_connection(p)
- void *p;
- {
-
- char buf[1024];
- int addrlen, fd;
- struct sockaddr addr;
-
- addrlen = sizeof(addr);
- if ((fd = accept(flisten, &addr, &addrlen)) < 0) return;
- if (fkbd >= 0) {
- sprintf(buf, "*** %s busy\n", Hostname);
- write(fd, buf, strlen(buf));
- close(fd);
- return;
- }
- fflush(stdin);
- fflush(stdout);
- fflush(stderr);
- dup2(fd, 0);
- dup2(fd, 1);
- dup2(fd, 2);
- close(fd);
- fkbd = 0;
- on_read(fkbd, keyboard, (void *) 0);
- printf(Prompt, Hostname);
- }
-
- /*---------------------------------------------------------------------------*/
-
- void remote_kbd_initialize()
- {
-
- #if (defined(hpux)||defined(__hpux))
- #define NETKBD_SOCKET "unix:/tcp/.sockets/netkbd"
- #else
- #define NETKBD_SOCKET "*:4720"
- #endif
-
- int addrlen;
- int arg;
- struct sockaddr *addr;
-
- if (!(addr = build_sockaddr(NETKBD_SOCKET, &addrlen))) return;
- if ((flisten = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) return;
- switch (addr->sa_family) {
- case AF_UNIX:
- if (!Debug) unlink(addr->sa_data);
- break;
- case AF_INET:
- arg = 1;
- setsockopt(flisten, SOL_SOCKET, SO_REUSEADDR, (char *) &arg, sizeof(arg));
- break;
- }
- if (bind(flisten, addr, addrlen) || listen(flisten, SOMAXCONN)) {
- close(flisten);
- return;
- }
- on_read(flisten, accept_connection, (void *) 0);
- }
-
-